/*
 * Funambol is a mobile platform developed by Funambol, Inc. 
 * Copyright (C) 2008 Funambol, Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission 
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 
 * WARRANTY OF NON INFRINGEMENT  OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License 
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 * 
 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 
 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * "Powered by Funambol" logo. If the display of the logo is not reasonably 
 * feasible for technical reasons, the Appropriate Legal Notices must display
 * the words "Powered by Funambol".
 */

#ifndef INCL_ALARM_DATASTORE
#define INCL_ALARM_DATASTORE

#include "SQLiteDriver.h"
#include "TimeUtils.h"
#include "Date.h"
#include "Event.h"

using namespace Funambol;

class AlarmDataStore {
    
private:
    /**
     * The SQLiteDriver to store in the database. It is the same istance of the driver that is in the
     * event data store. The AlarmDataStore doesn't exists if no event exists
     */
    SQLiteDriver& driver;
    
    /**
     * Creates the query to insert the alarm in the storage
     */    
    StringBuffer createInsertAlarmStmt(Event& event, const char* identifier) ;
    StringBuffer createInsertAlarmChangesStmt(Event& event, const char* identifier, const char* alarmid);
    
    /**
     * Creates the query to delete the item from the storage
     */    
    StringBuffer createDeleteAlarmChangesStmt(Event& event, const char* identifier, const char* alarmid);
    StringBuffer createDeleteAlarmStmt(const char* identifier); // used only for the update.
    
    /**
     * Creates the query to update an alarm in the storage
     */    
    StringBuffer createUpdateAlarmStmt(Event& event, const char* identifier);
    StringBuffer createUpdateAlarmChangesStmt(Event& event, const char* identifier, const char* alarmid);
    
    /**
     * It populates an Alarm object from an arrayList with all the fields populated from the
     * db.
     * @param al the arraylist containing all the fields
     * @return the Alarm object filled with the data. It should be added to the 
     *         Event object. If there is any error, the returned value is NULL
     */
    Alarm* populateAlarm(const ArrayList& al);
    
public:
    
    AlarmDataStore(SQLiteDriver& d) : driver(d) { }
    
    ~AlarmDataStore() {}
    
    /**
     * Used to check if there are any alarm in the table of alarms. To discriminate if
     * insert a new one, update or delete...
     * @param identifier - the id of the event
     * @param al - [OUT] the array list with the id of the alarms in the db.
     * @return true if there is any alarm (size of al is greater than 0), false otherwise
     */
    bool containsReminder(const char* identifier, ArrayList& al);
    
    /**
     * The method inserts a Recurrence using the id of the event. It is no needed
     * to have the id of the Recurrence just inserted.
     */
    int insertAlarm(Event& alarm, const char* identifier);
    
    int updateAlarm(Event& event, const char* identifier, const char* alarmid);
    
    int deleteAlarm(Event& event, const char* identifier, bool alsoAlarmTable);
    
    /**
     * It returns an Alarm object to be attached in the event object if there is any.
     * it return NULL otherwise...
     * The Event in the parameter is used to calculate the right date of the alarm
     * referred to the start date of the event (only startDate is used...)
     */
    Alarm* getAlarm(Event& event, const char* id_event);
    
};

#endif
